#include <iostream>
#include <string>

using namespace std;

class A {
 public:
  A() { cout << "- A Init -" << endl; };
  ~A() { cout << "- A Dest -" << endl; }

  void Print() { cout << *_sstr << endl; }

  static void sPrint() { cout << *_sstr << endl; }
  static void Show() {
    // 7. 静态成员函数只能访问静态成员变量与静态成员函数（因为没有this指针）
    // cout << _str << endl; // FAILED
    cout << _sstr << endl;
    // Print(); // FAILED
    sPrint();
  }

  static string *_sstr;

 private:
  int _data;
  string _str;
};

// 5. 静态成员变量只能在类外初始化，不加static！
string *A::_sstr = nullptr;

void loop() {
  // 1. 只会初始化一次
  // 局部静态变量x
  static int x;
  for (int i = 0; i < 5; ++i) cout << x++ << " ";
  cout << endl;
}

// 4. 全局static变量在执行main之前初始化
static A a;
// 2. static变量仅在当前文件有效，外部文件无法访问（即使使用extern）

int main(int argc, char const *argv[]) {
  loop();
  // cout << x << endl; // x作用域不改变

  // 3. 静态区所有字节默认为0
  char str[100];
  static char sstr[100];  // 0
  cout << str << " | " << sstr << endl;

  A b;
  A::_sstr = new string("hello");
  a.Print();  // 6. 所有类对象共享同一static变量

  // 8. 访问类静态成员(public)：
  cout << A::_sstr << endl;
  cout << b._sstr << endl;
  cout << A()._sstr << endl;
  A::sPrint();
  b.Show();

  return 0;
}
